/**
 * @class OpenLayers.Map
 * Funcionalidades extras adicionadas na biblioteca OpenLayers.
 * 
 * Mais detalhes em: [OpenLayers][1].
 * 
 * [1]: http://dev.openlayers.org/releases/OpenLayers-2.13.1/doc/apidocs/files/OpenLayers/Map-js.html
 */
OpenLayers.Map.prototype.fallThrough = true;
OpenLayers.Map.prototype.groups = [];

/**
 * @method addGroup
 * Adiciona um grupo no mapa.
 * 
 * Exemplo de uso:
 * 
 *     var mub = new OpenLayers.Group({
 *     	name: "Mub"
 *     });
 *     
 *     mapService.map.addGroup(null, mub);
 *     
 * @param {MapService.Layer.Group} parent Grupo pai, nulo para adicionar na raiz.
 * @param {MapService.Layer.Group} group grupo a ser adicionado no mapa.
 */
OpenLayers.Map.prototype.addGroup = function(parent, group){
	var me = this;
	
	if(group.parent != null){
    	OpenLayers.Util.removeItem(group.parent.children, group);
    }
	
	if(parent === null){
		me.groups.push(group);
	}else{
		parent.children.push(group);
	}
	
	group.parent = parent;
	group.map = me;
	
    /**
     * @event addgroup
     * Disparado quando um novo grupo for adicionado no mapa.
     * @param {Object} object
     * @param {MapService.Layer.Group} object.group Grupo adicionado no mapa.
     */
	me.events.triggerEvent("addgroup", {
		group    : group
	});
};

/**
 * @method removeGroup
 * Remove um grupo do mapa.
 * 
 * Exemplo de uso:
 * 
 *     mapService.map.removeGroup(mub);
 *     
 * @param {MapService.Layer.Group} group grupo a ser removido do mapa.
 */
OpenLayers.Map.prototype.removeGroup = function(group){
	var me = this;
	
	if(group.parent != null){
    	OpenLayers.Util.removeItem(group.parent.children, group);
    }else{
    	OpenLayers.Util.removeItem(me.groups, group);
    }
	
    /**
     * @event removegroup
     * Disparado quando um grupo for removido do mapa.
     * @param {Object} object
     * @param {MapService.Layer.Group} object.group Grupo removido do mapa.
     */
	me.events.triggerEvent("removegroup", {
		group    : group
	});
};

/**
 * @method getGroup
 * Encontra um grupo no mapa através do id.
 * 
 * Exemplo de uso:
 * 
 *     var mub = mapService.map.getGroup('mub');
 *     
 * @param {String} id Id do grupo a ser pesquisado.
 * @returns {MapService.Layer.Group}
 */
OpenLayers.Map.prototype.getGroup = function(id){
	var me = this;
	
	var found = null;
	for(var i = 0; i < me.groups.length; i++){
		me.groups[i].cascadeBy(function(group){
			if(group.id === id){
				found = group;
				return false;
			}
		});
		
		if(found){
			break;	
		}
	}
	
	return found;
};

/**
 * @method getGroupByName
 * Encontra grupos no mapa através do nome.
 * 
 * Exemplo de uso:
 * 
 *     var grupos = mapService.map.getGroupByName('mub');
 *     
 * @param {String} name Nome do grupo a ser pesquisado.
 * @returns {MapService.Layer.Group[]}
 */
OpenLayers.Map.prototype.getGroupByName = function(name){
	var me = this;
	
	var founds = [];
	for(var i = 0; i < me.groups.length; i++){
		me.groups[i].cascadeBy(function(group){
			if(group.name === name){
				founds.push(group);
			}
		});
	}
	
	return founds;
};